package com.fortune.app.models;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * 梦境解析系统实现类
 */
public class DreamInterpreter {
    private Map<String, Map<String, String>> dreamSymbols;
    private Map<String, List<String>> dreamCategories;
    
    public DreamInterpreter() {
        initDreamSymbols();
        initDreamCategories();
    }
    
    /**
     * 初始化梦境符号数据
     */
    private void initDreamSymbols() {
        dreamSymbols = new HashMap<>();
        
        // 人物类
        addDreamSymbol("父亲", "代表权威、指导、保护或控制", "人物");
        addDreamSymbol("母亲", "代表养育、关爱、保护或依赖", "人物");
        addDreamSymbol("孩子", "代表纯真、新生、潜力或责任", "人物");
        addDreamSymbol("老人", "代表智慧、经验、传统或过去", "人物");
        addDreamSymbol("陌生人", "代表未知的自我方面或新的可能性", "人物");
        
        // 动物类
        addDreamSymbol("蛇", "代表转变、智慧、诱惑或恐惧", "动物");
        addDreamSymbol("鸟", "代表自由、灵性、思想或愿望", "动物");
        addDreamSymbol("狗", "代表忠诚、友谊、保护或服务", "动物");
        addDreamSymbol("猫", "代表独立、神秘、女性特质或直觉", "动物");
        addDreamSymbol("马", "代表力量、自由、激情或欲望", "动物");
        
        // 物品类
        addDreamSymbol("房子", "代表自我、安全、庇护或心理状态", "物品");
        addDreamSymbol("车", "代表人生方向、控制或进展", "物品");
        addDreamSymbol("钱", "代表价值、自尊、力量或安全感", "物品");
        addDreamSymbol("书", "代表知识、学习、记忆或智慧", "物品");
        addDreamSymbol("门", "代表机会、过渡、选择或障碍", "物品");
        
        // 自然元素
        addDreamSymbol("水", "代表情感、潜意识、净化或变化", "自然");
        addDreamSymbol("火", "代表激情、转变、破坏或净化", "自然");
        addDreamSymbol("风", "代表变化、自由、思想或沟通", "自然");
        addDreamSymbol("山", "代表挑战、成就、稳定或障碍", "自然");
        addDreamSymbol("树", "代表成长、生命、家族或个人发展", "自然");
        
        // 情境类
        addDreamSymbol("飞行", "代表自由、超越限制、逃避或灵性提升", "情境");
        addDreamSymbol("坠落", "代表失控、恐惧、失败或释放", "情境");
        addDreamSymbol("追逐", "代表逃避、恐惧、压力或未解决的问题", "情境");
        addDreamSymbol("考试", "代表评估、压力、准备或自我怀疑", "情境");
        addDreamSymbol("婚礼", "代表承诺、结合、转变或新阶段", "情境");
        
        // 更多梦境符号...
        // 这里只列出了部分示例，实际实现需要更完整的梦境符号库
    }
    
    /**
     * 添加梦境符号
     */
    private void addDreamSymbol(String keyword, String meaning, String category) {
        Map<String, String> symbolInfo = new HashMap<>();
        symbolInfo.put("meaning", meaning);
        symbolInfo.put("category", category);
        dreamSymbols.put(keyword, symbolInfo);
    }
    
    /**
     * 初始化梦境类别
     */
    private void initDreamCategories() {
        dreamCategories = new HashMap<>();
        
        List<String> people = new ArrayList<>();
        people.add("父亲");
        people.add("母亲");
        people.add("孩子");
        people.add("老人");
        people.add("陌生人");
        dreamCategories.put("人物", people);
        
        List<String> animals = new ArrayList<>();
        animals.add("蛇");
        animals.add("鸟");
        animals.add("狗");
        animals.add("猫");
        animals.add("马");
        dreamCategories.put("动物", animals);
        
        List<String> objects = new ArrayList<>();
        objects.add("房子");
        objects.add("车");
        objects.add("钱");
        objects.add("书");
        objects.add("门");
        dreamCategories.put("物品", objects);
        
        List<String> nature = new ArrayList<>();
        nature.add("水");
        nature.add("火");
        nature.add("风");
        nature.add("山");
        nature.add("树");
        dreamCategories.put("自然", nature);
        
        List<String> situations = new ArrayList<>();
        situations.add("飞行");
        situations.add("坠落");
        situations.add("追逐");
        situations.add("考试");
        situations.add("婚礼");
        dreamCategories.put("情境", situations);
    }
    
    /**
     * 解析梦境
     * 
     * @param dreamDescription 梦境描述
     * @param keywords 关键词列表，可以为null
     * @return 梦境解析结果
     */
    public Map<String, Object> interpretDream(String dreamDescription, List<String> keywords) {
        try {
            // 如果未提供关键词，从描述中提取
            if (keywords == null || keywords.isEmpty()) {
                keywords = extractKeywords(dreamDescription);
            }
            
            // 查找匹配的符号
            List<Map<String, Object>> matchedSymbols = new ArrayList<>();
            for (String keyword : keywords) {
                Map<String, String> symbolInfo = dreamSymbols.get(keyword);
                if (symbolInfo != null) {
                    Map<String, Object> matchedSymbol = new HashMap<>();
                    matchedSymbol.put("keyword", keyword);
                    matchedSymbol.put("meaning", symbolInfo.get("meaning"));
                    matchedSymbol.put("category", symbolInfo.get("category"));
                    matchedSymbols.add(matchedSymbol);
                }
            }
            
            // 生成整体解读
            String overallInterpretation = generateOverallInterpretation(dreamDescription, matchedSymbols);
            
            // 生成建议
            List<String> advice = generateAdvice(matchedSymbols);
            
            // 返回结果
            Map<String, Object> result = new HashMap<>();
            result.put("dream_description", dreamDescription);
            result.put("keywords", keywords);
            result.put("matched_symbols", matchedSymbols);
            result.put("overall_interpretation", overallInterpretation);
            result.put("advice", advice);
            result.put("interpretation_time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(new Date()));
            
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return new HashMap<>();
        }
    }
    
    /**
     * 从描述中提取关键词
     */
    private List<String> extractKeywords(String dreamDescription) {
        List<String> extractedKeywords = new ArrayList<>();
        
        // 遍历所有已知的梦境符号
        for (String keyword : dreamSymbols.keySet()) {
            // 检查描述中是否包含关键词
            if (dreamDescription.contains(keyword)) {
                extractedKeywords.add(keyword);
            }
        }
        
        return extractedKeywords;
    }
    
    /**
     * 生成整体解读
     */
    private String generateOverallInterpretation(String dreamDescription, List<Map<String, Object>> matchedSymbols) {
        if (matchedSymbols.isEmpty()) {
            return "您的梦境描述中没有找到明确的符号。梦境可能反映了您当前的情绪状态或日常生活中的琐事。建议记录更多细节，或者尝试回忆梦境中的特定场景、人物或物品。";
        }
        
        // 分析符号类别分布
        Map<String, Integer> categoryCount = new HashMap<>();
        for (Map<String, Object> symbol : matchedSymbols) {
            String category = (String) symbol.get("category");
            categoryCount.put(category, categoryCount.getOrDefault(category, 0) + 1);
        }
        
        // 确定主导类别
        String dominantCategory = null;
        int maxCount = 0;
        for (Map.Entry<String, Integer> entry : categoryCount.entrySet()) {
            if (entry.getValue() > maxCount) {
                maxCount = entry.getValue();
                dominantCategory = entry.getKey();
            }
        }
        
        // 根据主导类别生成解读
        StringBuilder interpretation = new StringBuilder();
        
        // 开头
        interpretation.append("您的梦境中出现了多个").append(dominantCategory).append("类符号，这表明");
        
        if ("人物".equals(dominantCategory)) {
            interpretation.append("您当前可能正在思考人际关系或与特定人物的互动。这些人物可能代表您生活中的实际人物，也可能是您内在自我的不同方面。");
        } else if ("动物".equals(dominantCategory)) {
            interpretation.append("您可能正在探索本能、直觉或原始情感。动物通常代表我们内在的本性或我们试图控制或整合的特质。");
        } else if ("物品".equals(dominantCategory)) {
            interpretation.append("您可能正在关注物质世界、实际问题或具体目标。这些物品可能象征着您生活中的重要资源或工具。");
        } else if ("自然".equals(dominantCategory)) {
            interpretation.append("您可能正在经历情感或精神上的转变。自然元素通常代表强大的原始力量或内在状态。");
        } else if ("情境".equals(dominantCategory)) {
            interpretation.append("您可能正在处理特定的生活挑战或转变。这些情境通常反映您面对的实际问题或内在冲突。");
        }
        
        // 详细分析每个符号
        interpretation.append("\n\n具体符号分析：");
        for (Map<String, Object> symbol : matchedSymbols) {
            interpretation.append("\n- ").append(symbol.get("keyword")).append("：").append(symbol.get("meaning"));
            
            // 根据关键词添加更具体的解读
            String keyword = (String) symbol.get("keyword");
            if (keyword.equals("水")) {
                interpretation.append("。在您的梦中，水的状态（平静、湍急、清澈、浑浊）反映了您的情感状态。");
            } else if (keyword.equals("坠落")) {
                interpretation.append("。坠落的感觉可能表明您在某方面感到失控或不安全。");
            } else if (keyword.equals("飞行")) {
                interpretation.append("。飞行通常是积极的象征，表示您渴望自由或超越当前限制。");
            }
            // 可以为其他关键词添加更多具体解读
        }
        
        // 情感分析
        interpretation.append("\n\n情感分析：");
        if (dreamDescription.contains("害怕") || dreamDescription.contains("恐惧") || dreamDescription.contains("惊吓")) {
            interpretation.append("您的梦境中包含恐惧情绪，这可能反映了您在现实生活中面临的压力或担忧。");
        } else if (dreamDescription.contains("开心") || dreamDescription.contains("快乐") || dreamDescription.contains("幸福")) {
            interpretation.append("您的梦境中包含积极情绪，这可能表明您内心深处对某事感到满足或期待。");
        } else if (dreamDescription.contains("悲伤") || dreamDescription.contains("哭泣") || dreamDescription.contains("痛苦")) {
            interpretation.append("您的梦境中包含悲伤情绪，这可能是您需要处理的情感或失落的表现。");
        } else {
            interpretation.append("您的梦境情感不是很明显，可能反映了您当前平静或中性的情绪状态。");
        }
        
        // 整体结论
        interpretation.append("\n\n总体而言，这个梦可能表明");
        
        if ("人物".equals(dominantCategory)) {
            interpretation.append("您正在处理重要的人际关系或自我认同问题。关注梦中人物的行为和您与他们的互动，可能会发现有价值的见解。");
        } else if ("动物".equals(dominantCategory)) {
            interpretation.append("您正在探索自己的本能和直觉。这些动物可能代表您需要认识或整合的内在特质。");
        } else if ("物品".equals(dominantCategory)) {
            interpretation.append("您正在关注实际问题或物质需求。这些物品可能象征着您生活中重要的资源或目标。");
        } else if ("自然".equals(dominantCategory)) {
            interpretation.append("您正在经历内在的转变或情感波动。这些自然元素反映了您内心深处的状态和变化。");
        } else if ("情境".equals(dominantCategory)) {
            interpretation.append("您正在处理特定的生活挑战或转变。这些情境可能直接对应您现实生活中的情况或内在冲突。");
        }
        
        return interpretation.toString();
    }
    
    /**
     * 生成建议
     */
    private List<String> generateAdvice(List<Map<String, Object>> matchedSymbols) {
        List<String> advice = new ArrayList<>();
        
        if (matchedSymbols.isEmpty()) {
            advice.add("尝试记录更多梦境细节，包括场景、人物、物品和情感反应。");
            advice.add("在睡前放松心情，可以帮助您更清晰地记住梦境。");
            advice.add("保持梦境日记，记录重复出现的主题或符号。");
            return advice;
        }
        
        // 通用建议
        advice.add("反思这些梦境符号与您当前生活状况的关联。");
        advice.add("注意梦中的情感反应，它们通常比符号本身更能揭示梦境的意义。");
        
        // 根据符号类别提供具体建议
        for (Map<String, Object> symbol : matchedSymbols) {
            String category = (String) symbol.get("category");
            String keyword = (String) symbol.get("keyword");
            
            if ("人物".equals(category)) {
                if (keyword.equals("陌生人")) {
                    advice.add("梦见陌生人可能表示您需要探索自己未知的一面，尝试接触新的社交圈或体验新活动。");
                } else if (keyword.equals("父亲") || keyword.equals("母亲")) {
                    advice.add("梦见父母可能与权威关系或家庭动态有关，考虑您与父母或权威人物的关系是否需要调整。");
                }
            } else if ("动物".equals(category)) {
                if (keyword.equals("蛇")) {
                    advice.add("梦见蛇通常与转变或智慧有关，可能是时候放下旧的模式或接受变化了。");
                } else if (keyword.equals("鸟")) {
                    advice.add("梦见鸟象征自由和灵性，考虑您是否需要更多的自由或精神探索。");
                }
            } else if ("物品".equals(category)) {
                if (keyword.equals("房子")) {
                    advice.add("梦见房子与自我和安全感有关，反思您的家庭环境或内心状态是否需要调整。");
                } else if (keyword.equals("车")) {
                    advice.add("梦见车与人生方向有关，考虑您是否对当前的人生道路感到满意或需要改变。");
                }
            } else if ("自然".equals(category)) {
                if (keyword.equals("水")) {
                    advice.add("梦见水与情感有关，尝试更深入地了解和表达您的情感。");
                } else if (keyword.equals("火")) {
                    advice.add("梦见火与激情和转变有关，可能是时候释放创造力或开始新的项目了。");
                }
            } else if ("情境".equals(category)) {
                if (keyword.equals("飞行")) {
                    advice.add("梦见飞行与自由和超越限制有关，寻找生活中可以让您感到自由和成长的机会。");
                } else if (keyword.equals("坠落")) {
                    advice.add("梦见坠落与失控或恐惧有关，识别生活中让您感到不安全的因素，并寻求支持。");
                }
            }
        }
        
        // 如果建议不足三条，添加通用建议
        if (advice.size() < 3) {
            advice.add("保持梦境日记，记录重复出现的主题或符号，有助于发现更深层的模式。");
            advice.add("在睡前进行冥想或放松练习，可以帮助您获得更有意义的梦境体验。");
        }
        
        return advice;
    }
    
    /**
     * 搜索梦境关键词
     * 
     * @param keyword 关键词
     * @return 匹配的梦境符号列表
     */
    public List<Map<String, Object>> searchDreamKeyword(String keyword) {
        List<Map<String, Object>> results = new ArrayList<>();
        
        // 精确匹配
        Map<String, String> exactMatch = dreamSymbols.get(keyword);
        if (exactMatch != null) {
            Map<String, Object> result = new HashMap<>();
            result.put("keyword", keyword);
            result.put("meaning", exactMatch.get("meaning"));
            result.put("category", exactMatch.get("category"));
            result.put("match_type", "精确匹配");
            results.add(result);
        }
        
        // 模糊匹配
        for (Map.Entry<String, Map<String, String>> entry : dreamSymbols.entrySet()) {
            String key = entry.getKey();
            if (!key.equals(keyword) && key.contains(keyword)) {
                Map<String, Object> result = new HashMap<>();
                result.put("keyword", key);
                result.put("meaning", entry.getValue().get("meaning"));
                result.put("category", entry.getValue().get("category"));
                result.put("match_type", "相关匹配");
                results.add(result);
            }
        }
        
        return results;
    }
    
    /**
     * 获取梦境类别列表
     */
    public List<String> getDreamCategories() {
        return new ArrayList<>(dreamCategories.keySet());
    }
    
    /**
     * 获取指定类别的梦境符号
     */
    public List<Map<String, Object>> getDreamSymbolsByCategory(String category) {
        List<Map<String, Object>> results = new ArrayList<>();
        
        List<String> keywords = dreamCategories.get(category);
        if (keywords != null) {
            for (String keyword : keywords) {
                Map<String, String> symbolInfo = dreamSymbols.get(keyword);
                if (symbolInfo != null) {
                    Map<String, Object> result = new HashMap<>();
                    result.put("keyword", keyword);
                    result.put("meaning", symbolInfo.get("meaning"));
                    result.put("category", category);
                    results.add(result);
                }
            }
        }
        
        return results;
    }
}
